<?php

require_once("evalable.php");

class NumberObject extends Evalable {

    var $v = null;

    function NumberObject($value) {
        if (is_object($value) && get_class($value) == "NumberObject") {
            $value = $value->v;
        }
        $this->v = $value;
    }

    function repr() {
        return $this->v;
    }

    function getval() {
        return $this->v;
    }

    function lispeval($env, $args=null) {
        return $this;
    }

    function nullp() {
        if ($this->v == 0) {
            return new LogicObject(1);
        } else {
            return new LogicObject(0);
        }
    }

    function cmp($other) {
        if (get_class($this) == get_class($other)) {
            if ($this->v == $other->v) {
                return 0;
            } elseif ($this->v > $other->v) {
                return 1;
            } else {
                return -1;
            }
        } else {
            if ($this->v == $other) {
                return 0;
            } elseif ($this->v > $other) {
                return 1;
            } else {
                return -1;
            }
        }
    }

    function add($other) {
        if (is_object($other) && get_class($this) == get_class($other)) {
            return new NumberObject($this->v + $other->v);
        } else {
            return $this->v + $other;
        }
    }

    function sub($other) {
        if (get_class($this) == get_class($other)) {
            return new NumberObject($this->v - $other->v);
        } else {
            return $this->v - $other;
        }
    }

    function mul($other) {
        if (get_class($this) == get_class($other)) {
            return new NumberObject($this->v * $other->v);
        } else {
            return $this->v * $other;
        }
    }

    function div($other) {
        if (get_class($this) == get_class($other)) {
            return new NumberObject($this->v / $other->v);
        } else {
            return $this->v / $other;
        }
    }

    function mod($other) {
        if (get_class($this) == get_class($other)) {
            return new NumberObject($this->v % $other->v);
        } else {
            return $this->v % $other;
        }
    }

}
